package com.wu.match;

/**
 * 正则表达式匹配
 * 请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符，
 * 而'*'表示它前面的字符可以出现任意次（包含0次）。 在本题中，匹配是指字符串的所有字符匹配整个模式。
 * 例如，字符串"aaa"与模式"a.a"和"ab*ac*a"匹配，但是与"aa.a"和"ab*a"均不匹配
 */
public class Solution {
    public static boolean match(char[] str, char[] pattern) {
        return solve(str, pattern, 0, 0);
    }

    static boolean solve(char[] str, char[] pattern, int i, int j) {
        if (str.length == i) {
            return check(pattern, j);
        }
        if (j == pattern.length) {
            return str.length == i;
        }
        if (j + 1 < pattern.length && pattern[j + 1] == '*') {
            return (str[i] == pattern[j] || pattern[j] == '.') && solve(str, pattern, i + 1, j)
                    || solve(str, pattern, i, j + 2);
        } else if (pattern[j] == '.' || str[i] == pattern[j]) {
            return solve(str, pattern, i + 1, j + 1);
        } else {
            return false;
        }
    }

    private static boolean check(char[] pattern, int j) {
        if (j == pattern.length) {
            return true;
        }
        if ((pattern.length - j) % 2 != 0) {
            return false;
        }
        for (int i = j; i < pattern.length; i += 2) {
            if (pattern[i + 1] != '*') {
                return false;
            }
        }
        return true;
    }

    public static void main(String[] args) {
        char[] str = new char[]{'a','a','.','a'};
        char[] pattern = new char[]{'a','b','*','a'};
        boolean match = match(str, pattern);
        System.out.println(match);
    }
}